﻿// -------------------------------------------------------------------------
//    @FileName         :    NFPackageModule.h
//    @Author           :    gaoyi
//    @Date             :    2024/12/12
//    @Email            :    445267987@qq.com
//    @Module           :    NFPackageModule
//
// -------------------------------------------------------------------------

// --- 文件总结 ---------------------------------------------------------------
// `NFPackageModule` 是背包模块类：
// - 处理客户端背包相关的所有请求（整理、购买格子、使用物品、宝箱选择等）
// - 处理服务器间背包相关的消息（在线整理、购买格子、仓库物品变更等）
// - 继承自 NFLogicDynamicModule，是游戏逻辑模块的一部分
// ---------------------------------------------------------------------------

#pragma once

#include "NFComm/NFCore/NFPlatform.h"
#include "NFComm/NFCore/NFPlatform.h"
#include "NFLogicCommon/NFMMODynamicModule.h"
#include "NFLogicCommon/NFLogicBindRpcService.h"
#include "NFLogicDynamicModule.h"

namespace proto_ff
{
    class ItemUseLimite;
}

class NFPlayer;

/**
 * @brief 背包模块类
 * 处理所有与背包相关的客户端请求和服务器消息
 */
class NFPackageModule : public NFLogicDynamicModule
{
public:
    /**
     * @brief 构造函数
     * @param p 插件管理器指针
     */
    NFPackageModule(NFIPluginManager *p);

    /**
     * @brief 析构函数
     */
    ~NFPackageModule() override;
public:
    /**
     * @brief 模块初始化
     * @return 0成功，非0失败
     */
    int Awake() override;

    /**
     * @brief 处理客户端消息
     * @param packet 数据包
     * @param pSession 会话指针
     * @param req 客户端请求
     * @return 0成功，非0失败
     */
    int OnHandleClientMessage(NFDataPackage &packet, NFSession *pSession, const proto_ff::Proto_CSReq &req) override;
    
    /**
     * @brief 处理服务器消息
     * @param unLinkId 连接ID
     * @param packet 数据包
     * @return 0成功，非0失败
     */
    int OnHandleServerMessage(uint64_t unLinkId, NFDataPackage& packet) override;
public:
    /**
     * @brief 处理整理背包请求
     */
    int ProcessArrangeBagReq(NFDataPackage &packet, NFSession *pSession, const proto_ff::Proto_CSReq &req);
    
    /**
     * @brief 处理购买格子请求
     */
    int ProcessBuyGridReq(NFDataPackage &packet, NFSession *pSession, const proto_ff::Proto_CSReq &req);
    
    /**
     * @brief 处理使用物品请求
     */
    int ProcessUseItemReq(NFDataPackage &packet, NFSession *pSession, const proto_ff::Proto_CSReq &req);
    
    /**
     * @brief 处理宝箱选择请求
     */
    int ProcessBoxSelectReq(NFDataPackage &packet, NFSession *pSession, const proto_ff::Proto_CSReq &req);
    
    /**
     * @brief 处理保存到仓库请求
     */
    int ProcessSaveToStorageReq(NFDataPackage &packet, NFSession *pSession, const proto_ff::Proto_CSReq &req);
    
    /**
     * @brief 处理从仓库取出请求
     */
    int ProcessPickFromStorageReq(NFDataPackage &packet, NFSession *pSession, const proto_ff::Proto_CSReq &req);
    
    /**
     * @brief 处理物品兑换请求
     */
    int ProcessItemExchangeReq(NFDataPackage &packet, NFSession *pSession, const proto_ff::Proto_CSReq &req);
    
    /**
     * @brief 处理丢弃物品请求
     */
    int ProcessThrowawayReq(NFDataPackage &packet, NFSession *pSession, const proto_ff::Proto_CSReq &req);
    
    /**
     * @brief 处理金钱兑换请求
     */
    int ProcessMoneyExchangeReq(NFDataPackage &packet, NFSession *pSession, const proto_ff::Proto_CSReq &req);
    
    /**
     * @brief 处理分解物品请求
     */
    int ProcessDecomposeReq(NFDataPackage &packet, NFSession *pSession, const proto_ff::Proto_CSReq &req);
public:
    /**
     * @brief 处理在线整理背包
     */
    int ProcessOnlineArrangeBag(uint64_t unLinkId, NFDataPackage& packet);
    
    /**
     * @brief 处理在线购买背包格子
     */
    int ProcessOnlineBuyBagGrid(uint64_t unLinkId, NFDataPackage& packet);
    
    /**
     * @brief 处理仓库物品变更
     */
    int ProcessStorageItemChange(uint64_t unLinkId, NFDataPackage& packet);
public:
    /**
     * @brief 使用物品成功回调
     * @param pPlayer 玩家指针
     * @param itemId 物品ID
     * @param iNum 使用数量
     * @param pUseLimite 使用限制数据
     * @return 0成功，非0失败
     */
    int UseItemSuccess(NFPlayer* pPlayer, int itemId, int iNum, proto_ff::ItemUseLimite* pUseLimite);
};